"""ETF 实时数据工具模块."""

from __future__ import annotations

import json
import logging

from pydantic import BaseModel, Field

from ..data import ETFRealtimeQuote, fetch_etf_intraday_price

logger = logging.getLogger(__name__)


def format_realtime_text(output: ETFRealtimeOutput) -> str:
    """将 ETF 实时数据输出格式化为易读的中文文本，便于大模型理解."""
    lines = []
    
    # 标题
    lines.append(f"【{output.symbol} ETF 实时行情数据】")
    lines.append("")
    
    # 价格信息（最重要的信息）
    lines.append("💰 价格信息：")
    currency_str = f" {output.currency}" if output.currency else ""
    lines.append(f"  • 当前价格: {output.price:.4f}{currency_str}")
    
    # 涨跌信息
    if output.previous_close is not None:
        lines.append(f"  • 前一收盘价: {output.previous_close:.4f}{currency_str}")
        
        if output.change is not None and output.change_percent is not None:
            # 根据涨跌显示不同的符号和颜色提示
            if output.change >= 0:
                change_sign = "+"
                change_percent_sign = "+"
                trend = "📈 上涨"
            else:
                change_sign = ""
                change_percent_sign = ""
                trend = "📉 下跌"
            
            lines.append(f"  • {trend}")
            lines.append(f"    - 涨跌额: {change_sign}{output.change:.4f}{currency_str}")
            lines.append(f"    - 涨跌幅: {change_percent_sign}{output.change_percent * 100:.2f}%")
    lines.append("")
    
    # 成交量信息
    if output.volume is not None:
        lines.append("📊 成交量信息：")
        # 格式化成交量，大数字使用单位
        volume = output.volume
        if volume >= 1e9:
            lines.append(f"  • 累计成交量: {volume/1e9:.2f} 十亿股")
        elif volume >= 1e6:
            lines.append(f"  • 累计成交量: {volume/1e6:.2f} 百万股")
        elif volume >= 1e3:
            lines.append(f"  • 累计成交量: {volume/1e3:.2f} 千股")
        else:
            lines.append(f"  • 累计成交量: {volume:,.0f} 股")
        lines.append("")
    
    # 时间信息
    lines.append("🕐 时间信息：")
    # 解析 ISO 格式的时间戳，提取日期和时间部分
    as_of_str = output.as_of
    if "T" in as_of_str:
        # ISO 格式：YYYY-MM-DDTHH:MM:SS+HH:MM 或 YYYY-MM-DDTHH:MM:SSZ
        date_part, time_with_tz = as_of_str.split("T", 1)
        # 移除时区信息：处理 +HH:MM、-HH:MM、Z 等格式
        # 使用正则表达式或简单的字符串处理
        if time_with_tz.endswith("Z"):
            time_part = time_with_tz[:-1]
        elif "+" in time_with_tz:
            time_part = time_with_tz.split("+")[0]
        elif time_with_tz.count("-") > 2:  # 时间部分本身有 -，如果超过2个可能是时区
            # 从右边分割，取时间部分（假设时区在最后）
            time_part = time_with_tz.rsplit("-", 1)[0] if len(time_with_tz.rsplit("-", 1)[1]) <= 5 else time_with_tz
        else:
            time_part = time_with_tz
        lines.append(f"  • 数据时间: {date_part} {time_part}")
    else:
        lines.append(f"  • 数据时间: {as_of_str}")
    lines.append("")
    
    # 数据来源
    lines.append("ℹ️  数据来源：")
    lines.append(f"  • 来源: {output.source}")
    lines.append("")
    
    # 提示信息
    lines.append("💡 提示：")
    lines.append("  • 这是实时数据，每次调用都会获取最新价格")
    lines.append("  • 如需历史数据，请使用 etf_data_tool")
    
    return "\n".join(lines)


class ETFRealtimeInput(BaseModel):
    """ETF 实时数据输入模型."""

    symbol: str = Field(
        ...,
        description=(
            "ETF 基金代码或交易符号。"
            "支持多种格式：中国 A 股 ETF（如 159919、512880）、"
            "美股 ETF（如 SPY、QQQ、TLT）、港股 ETF（如 2800.HK）等。"
            "工具会自动标准化符号格式。"
        ),
    )


class ETFRealtimeOutput(BaseModel):
    """ETF 实时数据输出模型，包含 ETF 实时行情数据."""

    symbol: str = Field(
        ...,
        description="标准化后的 ETF 代码或交易符号。",
    )
    price: float = Field(
        ...,
        description="当前实时价格。",
    )
    as_of: str = Field(
        ...,
        description="价格时间戳，ISO 格式（YYYY-MM-DDTHH:MM:SS+00:00）。",
    )
    currency: str | None = Field(
        default=None,
        description="货币单位（如 USD、CNY、HKD 等）。",
    )
    volume: float | None = Field(
        default=None,
        description="成交量（当前交易日的累计成交量）。",
    )
    previous_close: float | None = Field(
        default=None,
        description="前一交易日收盘价。",
    )
    change: float | None = Field(
        default=None,
        description="价格变动（绝对值），即 price - previous_close。",
    )
    change_percent: float | None = Field(
        default=None,
        description="价格变动百分比，即 (price - previous_close) / previous_close。",
    )
    source: str = Field(
        default="akshare",
        description="数据来源。",
    )


class ETFRealtime:
    """获取 ETF 盘中实时数据的工具类."""

    def serialize_quote(self, quote: ETFRealtimeQuote) -> ETFRealtimeOutput:
        """将实时行情数据转换为结构化输出."""
        return ETFRealtimeOutput(
            symbol=quote.symbol,
            price=quote.price,
            as_of=quote.as_of.isoformat(),
            currency=quote.currency,
            volume=quote.volume,
            previous_close=quote.previous_close,
            change=quote.change,
            change_percent=quote.change_percent,
            source=quote.source,
        )

    def get_json(self, symbol: str) -> str:
        """返回 JSON 格式的实时数据."""
        logger.info("etf_realtime 正在获取 ETF 实时数据：symbol=%s", symbol)
        quote = fetch_etf_intraday_price(symbol)

        output = self.serialize_quote(quote)
        logger.info(
            "etf_realtime 获取完成：symbol=%s, price=%s, as_of=%s",
            quote.symbol,
            quote.price,
            quote.as_of.isoformat(),
        )
        return json.dumps(output.model_dump(), ensure_ascii=False)

    def format_text(self, json_str: str) -> str:
        """将 JSON 格式化为易读的中文文本."""
        result = json.loads(json_str)
        output = ETFRealtimeOutput(**result)
        return format_realtime_text(output)

    def get_output(self, symbol: str) -> ETFRealtimeOutput:
        """获取原始输出对象（用于测试和调试）。"""
        quote = fetch_etf_intraday_price(symbol)
        return self.serialize_quote(quote)

    def get_formatted_text(self, symbol: str) -> str:
        """获取格式化的中文文本."""
        json_str = self.get_json(symbol)
        return self.format_text(json_str)


# 向后兼容的别名（保持与旧代码的兼容性）
ETFRealtimeToolInput = ETFRealtimeInput
ETFRealtimeToolOutput = ETFRealtimeOutput


class ETFRealtimeTool:
    """向后兼容的别名类，实际功能由 ETFRealtime 提供."""

    def __init__(self):
        """初始化工具实例."""
        self._realtime = ETFRealtime()

    def _get_json(self, symbol: str) -> str:
        """返回 JSON 格式的实时数据（向后兼容方法）。"""
        return self._realtime.get_json(symbol)

    def _format_text(self, json_str: str) -> str:
        """将 JSON 格式化为易读的中文文本（向后兼容方法）。"""
        return self._realtime.format_text(json_str)

    def _get_output(self, symbol: str) -> ETFRealtimeOutput:
        """获取原始输出对象（向后兼容方法）。"""
        return self._realtime.get_output(symbol)

    def _run(self, symbol: str) -> str:
        """返回格式化的文本（向后兼容方法）。"""
        return self._realtime.get_formatted_text(symbol)


def main() -> None:
    """测试 ETFRealtime 的主函数."""
    # 配置日志
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    )

    # 重建 Pydantic 模型，确保类型注解正确解析
    from .pydantic_utils import rebuild_pydantic_models

    rebuild_pydantic_models(ETFRealtimeInput, ETFRealtimeOutput, ETFRealtime)

    # 创建工具实例
    realtime = ETFRealtime()

    # 测试用例列表
    test_cases = [
        {"symbol": "159796"},  # 中国 A 股 ETF
    ]

    print("=" * 80)
    print("ETF 实时数据工具测试")
    print("=" * 80)

    for i, test_case in enumerate(test_cases, 1):
        symbol = test_case["symbol"]

        print(f"\n[测试 {i}] 获取 ETF 实时数据: symbol={symbol}")
        print("-" * 80)

        try:
            # 调用工具，获取格式化的中文文本
            result_text = realtime.get_formatted_text(symbol=symbol)

            # 显示格式化文本
            print("返回的格式化文本：")
            print("-" * 80)
            print(result_text)
            print("-" * 80)

            # 通过方法获取原始输出对象，用于验证数据
            output = realtime.get_output(symbol=symbol)

            print(f"\n✓ 成功获取实时数据")
            print(f"  代码: {output.symbol}")
            print(f"  当前价格: {output.price}")
            print(f"  时间戳: {output.as_of}")
            if output.currency:
                print(f"  货币: {output.currency}")
            if output.volume is not None:
                print(f"  成交量: {output.volume:,.0f}")
            if output.previous_close is not None:
                print(f"  前一收盘价: {output.previous_close}")
            if output.change is not None:
                change_sign = "+" if output.change >= 0 else ""
                print(f"  涨跌额: {change_sign}{output.change:.4f}")
            if output.change_percent is not None:
                change_percent_sign = "+" if output.change_percent >= 0 else ""
                print(f"  涨跌幅: {change_percent_sign}{output.change_percent * 100:.2f}%")
            print(f"  数据来源: {output.source}")

        except Exception as e:
            print(f"✗ 测试失败: {type(e).__name__}: {e}")
            import traceback

            traceback.print_exc()

    print("\n" + "=" * 80)
    print("测试完成")
    print("=" * 80)


if __name__ == "__main__":
    main()

